Index: main/kernel/resources/js/Ametys/data/ServerComm.i18n.js
===================================================================
--- main/kernel/resources/js/Ametys/data/ServerComm.i18n.js	(revision 28600)
+++ main/kernel/resources/js/Ametys/data/ServerComm.i18n.js	(working copy)
@@ -253,7 +253,7 @@
 						
 						if (Ext.isObject(oldMessage.waitMessage))
 						{
-							oldMessage.waitMessage.hide();
+							oldMessage.bodyMasked ? Ext.getBody().unmask() : oldMessage.waitMessage.hide();
 						}
 					}
 				}
@@ -298,12 +298,20 @@
 				}
 				if (Ext.isObject(message.waitMessage))
 				{
-					message.waitMessage = Ext.applyIf(message.waitMessage, {
-						target: Ext.getBody()
-					});
-					
-					message.waitMessage = Ext.create("Ext.LoadMask", message.waitMessage);
-					message.waitMessage.show();
+					if (!message.waitMessage.target && Ext.ComponentQuery.query('viewport').length == 0)
+					{
+						message.waitMessage = Ext.getBody().mask (message.waitMessage.msg || "<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>", message.waitMessage.msgCls);
+						message.bodyMasked = true;
+					}
+					else
+					{
+						message.waitMessage = Ext.applyIf(message.waitMessage, {
+							target: Ext.ComponentQuery.query('viewport')[0]
+						});
+						
+						message.waitMessage = Ext.create("Ext.LoadMask", message.waitMessage);
+						message.waitMessage.show();
+					}
 				}
 			}
 			
@@ -657,7 +665,7 @@
 				var message = options.messages[i];
 				if (Ext.isObject(message.waitMessage))
 				{
-					message.waitMessage.hide();
+					message.bodyMasked ? Ext.getBody().unmask() : message.waitMessage.hide();
 				}
 			}
 		},
Index: main/plugin-core/i18n/messages_en.xml
===================================================================
--- main/plugin-core/i18n/messages_en.xml	(revision 28600)
+++ main/plugin-core/i18n/messages_en.xml	(working copy)
@@ -44,6 +44,7 @@
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_HELP">Help</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_HELP_TEXT">This screen allows you to change the application's configuration.&lt;br/&gt;&lt;br/&gt;Navigate through the top-right hand corner tabs and change the parameters' values.&lt;br/&gt;&lt;br/&gt;The application will be automatically restarted after the changes are saved.</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_OK">The configuration has been correctly updated</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_WAIT_MSG">Saving. Please wait ...</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_FATALERROR">Server is not responding or a fatal error occurred during saving.\nConsult applications and servlet engines logfiles for more details.</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_ERROR">An error occurred on the server and parameters have not been updated.\n\nInternal error message is :\n</message>
 	<message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_INVALID_TITLE">The form contains errors</message>
Index: main/plugin-core/i18n/messages_fr.xml
===================================================================
--- main/plugin-core/i18n/messages_fr.xml	(revision 28600)
+++ main/plugin-core/i18n/messages_fr.xml	(working copy)
@@ -44,6 +44,7 @@
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_HELP">Aide</message>    
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_HELP_TEXT">Cet écran vous permet de modifier la configuration système de l'application.&lt;br/&gt;&lt;br/&gt;Naviguez en utilisant les onglets et modifiez les valeurs des paramètres.&lt;br/&gt;&lt;br/&gt;Lorsque vous enregistrez les modifications, l'application sera redémarrée automatiquement pour prendre les modifications en compte.</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_OK">La configuration a été sauvée correctement</message>
+    <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_WAIT_MSG">Sauvegarde en cours.&lt;br/&gt;Veuillez patienter ...</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_FATALERROR">Le serveur ne répond pas ou une erreur grave est survenue lors de la sauvegarde.\nConsultez les journaux de l'application et du moteur de servlet pour plus de détails.</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_ERROR">Une erreur est survenue sur le serveur et les paramètres n'ont pas été sauvegardés.\n\nLe message d'erreur interne est :\n</message>
     <message key="PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_INVALID_TITLE">Le formulaire contient des erreurs</message>
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/Config.i18n.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/Config.i18n.js	(revision 28753)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/Config.i18n.js	(working copy)
@@ -1914,7 +1914,7 @@
 	{
 		if (mask)
 		{
-			 new Ext.LoadMask({target: Ext.getBody()}).show();
+			Ext.getBody().mask();
 		}
 	    document.location.href = Ametys.WORKSPACE_URI;
 	},
@@ -1967,23 +1967,20 @@
 						{
 							if (btn == 'yes')
 							{
-								me.save._mask = new Ext.LoadMask({target: Ext.getBody()});
-							    me.save._mask.show();
+								Ext.getBody().mask("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_WAIT_MSG'/>");
 							    Ext.defer(me._save2, 1, me);
 							}
 							else if (btn == 'no')
 							{
-								me.save._mask = new Ext.LoadMask({target: Ext.getBody()});
-							    me.save._mask.show();
-								me._check(me._paramCheckers, true, Ext.bind(function(success) { this.save._mask.hide(); if (success) { this.save(); } } , me), false);
+								Ext.getBody().mask("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_WAIT_MSG'/>");
+								me._check(me._paramCheckers, true, Ext.bind(function(success) { Ext.getBody().unmask(); if (success) { this.save(); } } , me), false);
 							}
 						}
 					});
 			return;
 		}
 		
-		me.save._mask = new Ext.LoadMask({target: Ext.getBody()});
-	    me.save._mask.show();
+		Ext.getBody().mask("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_CONFIG_SAVE_WAIT_MSG'/>");
 	    Ext.defer(me._save2, 1, me);
 	},
 	
@@ -2029,7 +2026,7 @@
 	    	ex = e;
 	    }
 	    
-	    this.save._mask.hide();
+	    Ext.getBody().unmask();
 
 		if (result == null)
 	    {
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/Logs.i18n.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/Logs.i18n.js	(revision 28600)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/Logs.i18n.js	(working copy)
@@ -357,8 +357,7 @@
 		}
 		else
 		{
-			this._mask = new Ext.LoadMask({target: Ext.getBody()});
-			this._mask.show();
+			Ext.getBody().mask("<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>");
 
 			var args = { level: level, category: selectedNode.get('fullname') };
 			Ametys.data.ServerComm.send({
@@ -386,7 +385,7 @@
 		var args = argsArray[0];
 		var selectedNode = argsArray[1];
 
-		this._mask.hide();
+		Ext.getBody().unmask();
 
 	    if (Ametys.data.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_LOGS_HANDLE_ERROR'/>", response, "org.ametys.administration.Groups._selectGroup"))
 	    {
Index: main/plugin-core/resources/js/Ametys/plugins/core/administration/Plugins.i18n.js
===================================================================
--- main/plugin-core/resources/js/Ametys/plugins/core/administration/Plugins.i18n.js	(revision 28600)
+++ main/plugin-core/resources/js/Ametys/plugins/core/administration/Plugins.i18n.js	(working copy)
@@ -53,10 +53,6 @@
 	 * @private
 	 * @property {Ext.tree.Panel} _tree3 The workspace tree
 	 */
-	/**
-	 * @private
-	 * @property {Ext.LoadMask} _mask A mak when saving changes and reloading
-	 */
 	
 	/**
 	 * @readonly
@@ -524,8 +520,7 @@
 			responseType: null
 		});
 		
-		this._mask =  new Ext.LoadMask({target: Ext.getBody()});
-		this._mask.show();
+		Ext.getBody().mask("<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>");
 	},
 
 	/**
@@ -535,17 +530,16 @@
 	 */
 	_changesNowCB: function(response)
 	{
-		this._mask.hide();
+		Ext.getBody().unmask();
 
 	    if (Ametys.data.ServerComm.handleBadResponse("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_ERROR'/>", response, "Ametys.plugins.core.administration.Plugins._changesNowCB"))
 	    {
 	       return;
 	    }
 
-	    alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DONE'/>");
+	    Ext.Msg.alert("<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES'/>", "<i18n:text i18n:key='PLUGINS_CORE_ADMINISTRATOR_PLUGINS_CHANGES_DONE'/>");
 
-		this._mask =  new Ext.LoadMask({target: Ext.getBody()});
-		this._mask.show();
+	    Ext.getBody().mask("<i18n:text i18n:key='KERNEL_LOADMASK_DEFAULT_MESSAGE' i18n:catalogue='kernel'/>");
 	    
 	    // Restart
 	    Ext.Ajax.request({url: Ametys.getPluginDirectPrefix(this.pluginName) + "/administrator/restart", params: "", async: false});
Index: main/workspace-admin/pages/common/common.xsl
===================================================================
--- main/workspace-admin/pages/common/common.xsl	(revision 28600)
+++ main/workspace-admin/pages/common/common.xsl	(working copy)
@@ -128,12 +128,14 @@
 			
 			    launch: function() {
 		    		var items = [];
-		    			var toping = createTop();
-		    			if (toping != null)
-		    			{
-		    				items.push(Ext.apply(toping, {region: 'north'}));
-		    			}
-		    			items.push(Ext.apply(createPanel(), {region: 'center'}));
+                    
+	    			var toping = createTop();
+	    			if (toping != null)
+	    			{
+	    				items.push(Ext.apply(toping, {region: 'north'}));
+	    			}
+                    
+	    			items.push(Ext.apply(createPanel(), {region: 'center'}));
 		    	
 			        var mainPanel = Ext.create('Ext.panel.Panel', {
 			            autoScroll: false,
@@ -156,8 +158,8 @@
 			        	this.setSize(Ext.get('main').getSize(true))
 					}, mainPanel);
 					
-					createDock();
-					
+                    createDock();
+                    
 					createBottom();
 					
 					if (typeof appReady == "function")